"""
带调试信息的RAG问答脚本

与普通问答模式不同，这个脚本会显示详细的调试信息，
帮助理解RAG系统的工作过程

作者：调试助手
"""

import sys
import os

# 添加src目录到Python路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))

from src.config import config
from src.rag_engine import RAGEngine, QAProcessor

def debug_qa_session():
    """运行带调试信息的问答会话"""
    print("🔍 RAG调试问答模式启动...")
    print("=" * 60)
    print("💡 此模式会显示详细的检索和处理信息")
    print("💡 输入 'quit' 或 'exit' 退出")
    print()
    
    try:
        # 创建RAG引擎
        rag_engine = RAGEngine()
        qa_processor = QAProcessor(rag_engine)
        
        # 显示当前配置
        print(f"⚙️ 当前配置:")
        print(f"   PDF文件: {config.PDF_PATH}")
        print(f"   块大小: {config.CHUNK_SIZE}")
        print(f"   重叠大小: {config.CHUNK_OVERLAP}")
        print(f"   TOP_K: {config.TOP_K}")
        print(f"   相似度阈值: {config.SIMILARITY_THRESHOLD}")
        print()
        
        # 检查系统状态
        status = rag_engine.get_system_status()
        print(f"🔧 系统状态:")
        print(f"   - RAG引擎已初始化: {'是' if status['rag_engine_initialized'] else '否'}")
        print(f"   - 文档已处理: {'是' if status['document_processed'] else '否'}")
        print(f"   - LLM服务可用: {'是' if status['llm_available'] else '否'}")
        
        # 如果文档未处理，先初始化
        if not status['document_processed']:
            print("\n⚠️ 文档尚未处理，正在初始化...")
            init_result = rag_engine.initialize_from_pdf()
            if init_result['success']:
                print("✅ 初始化成功!")
                stats = init_result['statistics']
                print(f"📊 处理统计:")
                print(f"   - 原始文本长度: {stats['original_text_length']} 字符")
                print(f"   - 清洗后文本长度: {stats['cleaned_text_length']} 字符")
                print(f"   - 文本块数量: {stats['text_chunks_count']} 个")
                print(f"   - 处理耗时: {stats['processing_time']:.2f} 秒")
            else:
                print(f"❌ 初始化失败: {init_result.get('message', '未知错误')}")
                print("🔄 将使用简单模式（无检索增强）")
        
        print("\n🚀 RAG调试问答系统已就绪！")
        print("🎯 建议测试问题: '翁和平的两首诗文分别叫什么名字，不用输出诗文内容'")
        print()
        
        while True:
            try:
                question = input("\n❓ 请输入您的问题: ").strip()
                
                if question.lower() in ['quit', 'exit', '退出']:
                    print("👋 再见！")
                    break
                
                if not question:
                    continue
                
                print("\n" + "=" * 50)
                print("🤔 正在处理您的问题...")
                print("=" * 50)
                
                # 详细的问答处理
                result = debug_question_processing(rag_engine, question)
                
                # 显示最终结果
                print("\n" + "=" * 50)
                print("🎯 最终结果")
                print("=" * 50)
                
                if result['success']:
                    print(f"🤖 回答: {result['answer']}")
                    print(f"📊 处理耗时: {result.get('processing_time', 0):.2f} 秒")
                else:
                    print(f"❌ 生成回答失败: {result.get('message', '未知错误')}")
                
            except KeyboardInterrupt:
                print("\n👋 再见！")
                break
            except Exception as e:
                print(f"❌ 处理问题时出错: {str(e)}")
        
    except Exception as e:
        print(f"❌ 调试问答模式启动失败: {str(e)}")

def debug_question_processing(rag_engine, question):
    """详细处理问题并显示调试信息"""
    
    # 步骤1：检索相关文档
    print("🔍 步骤1：检索相关文档")
    print("-" * 30)
    
    try:
        # 执行检索
        retrieval_results = rag_engine.retrieval_engine.search_and_rank(
            question, 
            top_k=config.TOP_K,
            similarity_threshold=config.SIMILARITY_THRESHOLD
        )
        
        print(f"📊 检索配置: TOP_K={config.TOP_K}, 阈值={config.SIMILARITY_THRESHOLD}")
        print(f"🎯 找到 {len(retrieval_results)} 个相关文档片段")
        
        if retrieval_results:
            for i, result in enumerate(retrieval_results[:3]):  # 显示前3个
                print(f"\n   📄 文档片段 {i+1}:")
                print(f"      相似度: {result.get('similarity', 0):.3f}")
                print(f"      内容: {result.get('content', '')[:150]}...")
                if len(result.get('content', '')) > 150:
                    print(f"      ...")
        else:
            print("⚠️ 未找到相关文档片段")
            print("💡 建议：尝试降低相似度阈值或调整查询方式")
        
    except Exception as e:
        print(f"❌ 检索失败: {str(e)}")
        retrieval_results = []
    
    # 步骤2：构造上下文
    print(f"\n🔧 步骤2：构造上下文")
    print("-" * 30)
    
    if retrieval_results:
        context_parts = []
        total_length = 0
        max_context_length = 2000
        
        for result in retrieval_results:
            content = result.get('content', '')
            if total_length + len(content) <= max_context_length:
                context_parts.append(content)
                total_length += len(content)
            else:
                # 添加部分内容
                remaining = max_context_length - total_length
                if remaining > 100:  # 至少保留100字符
                    context_parts.append(content[:remaining])
                break
        
        context = '\n\n'.join(context_parts)
        print(f"📏 上下文长度: {len(context)} 字符")
        print(f"📝 上下文预览:")
        print(f"   {context[:200]}...")
        
    else:
        context = ""
        print("⚠️ 无上下文信息，将使用简单模式")
    
    # 步骤3：生成回答
    print(f"\n🤖 步骤3：生成回答")
    print("-" * 30)
    
    try:
        if context:
            # RAG模式
            print("📋 使用RAG模式（检索增强生成）")
            result = rag_engine.ask_question(question, use_retrieval=True)
            result['mode'] = 'rag'
            result['retrieval_results'] = retrieval_results
            result['context_length'] = len(context)
        else:
            # 简单模式
            print("📋 使用简单模式（仅LLM生成）")
            result = rag_engine.ask_question(question, use_retrieval=False)
            result['mode'] = 'simple'
        
        if result['success']:
            print("✅ 回答生成成功")
        else:
            print(f"❌ 回答生成失败: {result.get('message', '未知错误')}")
        
        return result
        
    except Exception as e:
        print(f"❌ 生成回答时出错: {str(e)}")
        return {
            'success': False,
            'message': f'生成回答失败: {str(e)}',
            'question': question,
            'answer': '',
            'error': str(e)
        }

def main():
    """主函数"""
    print("🚀 RAG调试问答系统")
    print("📋 专门用于调试RAG系统的检索和问答过程")
    print()
    
    debug_qa_session()

if __name__ == "__main__":
    main() 